iT邦幫忙

2022 iThome 鐵人賽

DAY 29
3
Software Development

林姓商人與指令操作的秘密—談 Linux command line interface系列 第 29

Day 29:bash script 的迴圈,以及實際使用方式

  • 分享至 

  • xImage
  •  

會用 bash 撰寫 if 之後,接著我們來嘗試撰寫迴圈

bash script 的 while 迴圈範例寫法如下

count=1

while [[ "$count" -le 5 ]]; do
    echo $count
    count=$((count + 1))
done

運作起來的效果如下

./test
1
2
3
4
5

如果是對程式撰寫有一定經驗的讀者,應該會想到,既然有 while 的迴圈方式,一般來說,應該也會有 for 的迴圈方式

沒錯!bash script 的 for 迴圈範例寫法如下

#!/bin/bash

for (( i=1; i <= 5; i=i+1 )); do
      echo $i
done

效果跟 while 迴圈是一樣的。


說了這麼多。 這一些撰寫 bash script 的技能,有沒有實際用到的地方呢?

有的!舉個例子來說,後端 PHP 開發非常知名的框架 Laravel,就善用了 bash script 的技巧,讓整個專案安裝的時候更加的便利!

我們來看看 Laravel 官方教學的安裝方式:

curl -s "https://laravel.build/example-app" | bash

curl 會下載檔案,然後透過 | 指令將下載的內容送到 bash 指令內運作。不過 "https://laravel.build/example-app" 裡面的內容是什麼呢?

我們直接連進 https://laravel.build/example-app 看看內容

docker info > /dev/null 2>&1

# Ensure that Docker is running...
if [ $? -ne 0 ]; then
    echo "Docker is not running."

    exit 1
fi

docker run --rm \
    --pull=always \
    -v "$(pwd)":/opt \
    -w /opt \
    laravelsail/php81-composer:latest \
    bash -c "laravel new example-app && cd example-app && php ./artisan sail:install --with=mysql,redis,meilisearch,mailhog,selenium "

cd example-app

./vendor/bin/sail pull mysql redis meilisearch mailhog selenium
./vendor/bin/sail build

CYAN='\033[0;36m'
LIGHT_CYAN='\033[1;36m'
WHITE='\033[1;37m'
NC='\033[0m'

echo ""

if sudo -n true 2>/dev/null; then
    sudo chown -R $USER: .
    echo -e "${WHITE}Get started with:${NC} cd example-app && ./vendor/bin/sail up"
else
    echo -e "${WHITE}Please provide your password so we can make some final adjustments to your application's permissions.${NC}"
    echo ""
    sudo chown -R $USER: .
    echo ""
    echo -e "${WHITE}Thank you! We hope you build something incredible. Dive in with:${NC} cd example-app && ./vendor/bin/sail up"
fi

我們逐步分析這段 bash script 看看。

首先,透過 docker info > /dev/null 2>&1 運作 docker。不過,我們需要的不是輸出內容,而是是否能成功運作。如果不能,則輸出錯誤訊息 「"Docker is not running."」。

如果可以,那麼就利用 docker 運作 laravelsail/php81-composer:latest 這個影像檔,並在建立好的容器內執行 laravel new example-app && cd example-app && php ./artisan sail:install --with=mysql,redis,meilisearch,mailhog,selenium 。這樣可以避免掉使用者電腦環境的不同,導致程式下載可能出現的問題。

接著,進到專案資料夾內(cd example-app),利用 Laravel Sail 來部署專案:

  • ./vendor/bin/sail pull mysql redis meilisearch mailhog selenium
  • ./vendor/bin/sail build

接著,用 if 判斷目前的用戶是不是 su,如果不是的話,要求輸入密碼,並且執行 sudo chown -R $USER: .

最後輸出成功訊息:「Thank you! We hope you build something incredible. Dive in with: cd example-app && ./vendor/bin/sail up」

利用這些指令,Laravel 讓整個安裝流程,幾乎全部透過預先寫好的指令執行,減少使用者操作失誤的可能性,並且也減輕了安裝環境的負擔。

今天有關 bash script 的部分,就分享到這邊,明天是最後一天了!


上一篇
Day 28:再談怎麼撰寫 bash: if、read
下一篇
Day 30:最後一天,來統整一下指令操作的秘密都有哪些
系列文
林姓商人與指令操作的秘密—談 Linux command line interface30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言